#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

void* Routine(void* arg)
{
	while (1){
		printf("new  thread tid: %p\n", (void*)pthread_self());
		sleep(1);
	}
}
int main()
{
	pthread_t tid;
	pthread_create(&tid, NULL, Routine, NULL);
	while (1){
		printf("main thread tid: %p\n", (void*)pthread_self());
		sleep(2);
	}
	return 0;
}

// #include <stdio.h>
// #include <stdlib.h>
// #include <pthread.h>
// #include <unistd.h>
// #include <sys/types.h>

// void* Routine(void* arg)
// {
// 	pthread_detach(pthread_self());
// 	char* msg = (char*)arg;
// 	int count = 0;
// 	while (count < 3){
// 		printf("I am %s...pid: %d, ppid: %d, tid: %lu\n", msg, getpid(), getppid(), pthread_self());
// 		sleep(1);
// 		count--;
// 	}
// 	pthread_exit((void*)6666);
// }
// int main()
// {
// 	pthread_t tid[5];
// 	for (int i = 0; i < 5; i++){
// 		char* buffer = (char*)malloc(64);
// 		sprintf(buffer, "thread %d", i);
// 		pthread_create(&tid[i], NULL, Routine, buffer);
// 		printf("%s tid is %lu\n", buffer, tid[i]);
// 	}
//     int cnt = 5;
// 	while (cnt--){
// 		printf("I am main thread...pid: %d, ppid: %d, tid: %lu\n", getpid(), getppid(), pthread_self());
// 		sleep(1);
// 	}
// 	return 0;
// }

// #include <stdio.h>
// #include <stdlib.h>
// #include <pthread.h>
// #include <unistd.h>
// #include <sys/types.h>

// pthread_t main_thread;

// void* Routine(void* arg)
// {
// 	char* msg = (char*)arg;
// 	int count = 0;
// 	while (count < 5){
// 		printf("I am %s...pid: %d, ppid: %d, tid: %lu\n", msg, getpid(), getppid(), pthread_self());
// 		sleep(1);
// 		count++;
// 		pthread_cancel(main_thread);
// 	}
// 	pthread_exit((void*)6666);
// }
// int main()
// {
// 	main_thread = pthread_self();
// 	pthread_t tid[5];
// 	for (int i = 0; i < 5; i++){
// 		char* buffer = (char*)malloc(64);
// 		sprintf(buffer, "thread %d", i);
// 		pthread_create(&tid[i], NULL, Routine, buffer);
// 		printf("%s tid is %lu\n", buffer, tid[i]);
// 	}
// 	printf("I am main thread...pid: %d, ppid: %d, tid: %lu\n", getpid(), getppid(), pthread_self());
// 	for (int i = 0; i < 5; i++){
// 		void* ret = NULL;
// 		pthread_join(tid[i], &ret);
// 		printf("thread %d[%lu]...quit, exitcode: %lld\n", i, tid[i], (long long)ret);
// 	}
// 	return 0;
// }

// #include <stdio.h>
// #include <stdlib.h>
// #include <pthread.h>
// #include <unistd.h>
// #include <sys/types.h>

// void* Routine(void* arg)
// {
// 	char* msg = (char*)arg;
// 	int count = 0;
// 	while (count < 5){
// 		printf("I am %s...pid: %d, ppid: %d, tid: %lu\n", msg, getpid(), getppid(), pthread_self());
// 		sleep(1);
// 		count++;
// 	}
// 	pthread_exit((void*)6666);
// }
// int main()
// {
// 	pthread_t tid[5];
// 	for (int i = 0; i < 5; i++){
// 		char* buffer = (char*)malloc(64);
// 		sprintf(buffer, "thread %d", i);
// 		pthread_create(&tid[i], NULL, Routine, buffer);
// 		printf("%s tid is %lu\n", buffer, tid[i]);
// 	}
// 	pthread_cancel(tid[0]);
// 	pthread_cancel(tid[1]);
// 	pthread_cancel(tid[2]);
// 	pthread_cancel(tid[3]);
// 	printf("I am main thread...pid: %d, ppid: %d, tid: %lu\n", getpid(), getppid(), pthread_self());
// 	for (int i = 0; i < 5; i++){
// 		void* ret = NULL;
// 		pthread_join(tid[i], &ret);
// 		printf("thread %d[%lu]...quit, exitcode: %lld\n", i, tid[i], (long long)ret);
// 	}
// 	return 0;
// }

// #include <stdio.h>
// #include <stdlib.h>
// #include <pthread.h>
// #include <unistd.h>
// #include <sys/types.h>

// void* Routine(void* arg)
// {
// 	char* msg = (char*)arg;
// 	int count = 0;
// 	while (count < 5){
// 		printf("I am %s...pid: %d, ppid: %d, tid: %lu\n", msg, getpid(), getppid(), pthread_self());
// 		sleep(1);
// 		count++;
// 		pthread_cancel(pthread_self());
// 	}
// 	pthread_exit((void*)6666);
// }
// int main()
// {
// 	pthread_t tid[5];
// 	for (int i = 0; i < 5; i++){
// 		char* buffer = (char*)malloc(64);
// 		sprintf(buffer, "thread %d", i);
// 		pthread_create(&tid[i], NULL, Routine, buffer);
// 		printf("%s tid is %lu\n", buffer, tid[i]);
// 	}
// 	printf("I am main thread...pid: %d, ppid: %d, tid: %lu\n", getpid(), getppid(), pthread_self());
// 	for (int i = 0; i < 5; i++){
// 		void* ret = NULL;
// 		pthread_join(tid[i], &ret);
// 		printf("thread %d[%lu]...quit, exitcode: %lld\n", i, tid[i], (long long)ret);
// 	}
// 	return 0;
// }

// #include <stdio.h>
// #include <stdlib.h>
// #include <pthread.h>
// #include <unistd.h>
// #include <sys/types.h>

// void* Routine(void* arg)
// {
// 	char* msg = (char*)arg;
// 	int count = 0;
// 	while (count < 3){
// 		printf("I am %s...pid: %d, ppid: %d, tid: %lu\n", msg, getpid(), getppid(), pthread_self());
// 		sleep(1);
// 		count++;
// 	}
// 	pthread_exit((void*)6666);
// }
// int main()
// {
// 	pthread_t tid[5];
// 	for (int i = 0; i < 5; i++){
// 		char* buffer = (char*)malloc(64);
// 		sprintf(buffer, "thread %d", i);
// 		pthread_create(&tid[i], NULL, Routine, buffer);
// 		printf("%s tid is %lu\n", buffer, tid[i]);
// 	}
// 	printf("I am main thread...pid: %d, ppid: %d, tid: %lu\n", getpid(), getppid(), pthread_self());
// 	for (int i = 0; i < 5; i++){
// 		void* ret = NULL;
// 		pthread_join(tid[i], &ret);
// 		printf("thread %d[%lu]...quit, exitcode: %lld\n", i, tid[i], (long long)ret);
// 	}
// 	return 0;
// }


// #include <stdio.h>
// #include <stdlib.h>
// #include <pthread.h>
// #include <unistd.h>
// #include <sys/types.h>

// void* Routine(void* arg)
// {
// 	char* msg = (char*)arg;
// 	while (1){
// 		printf("I am %s...pid: %d, ppid: %d, tid: %lu\n", msg, getpid(), getppid(), pthread_self());
// 		sleep(1);
// 	}
// 	return (void*)0;
// }
// int main()
// {
// 	pthread_t tid[5];
// 	for (int i = 0; i < 5; i++){
// 		char* buffer = (char*)malloc(64);
// 		sprintf(buffer, "thread %d", i);
// 		pthread_create(&tid[i], NULL, Routine, buffer);
// 		printf("%s tid is %lu\n", buffer, tid[i]);
// 	}
// 	printf("I am main thread...pid: %d, ppid: %d, tid: %lu\n", getpid(), getppid(), pthread_self());

// 	return 0;
// }

// #include <stdio.h>
// #include <stdlib.h>
// #include <pthread.h>
// #include <unistd.h>
// #include <sys/types.h>

// void* Routine(void* arg)
// {
// 	char* msg = (char*)arg;
// 	int count = 0;
// 	while (count < 5){
// 		printf("I am %s...pid: %d, ppid: %d, tid: %lu\n", msg, getpid(), getppid(), pthread_self());
// 		sleep(1);
// 		count++;
// 		int* p = nullptr;
//         *p = 10;
// 	}
// 	return (void*)2022;
// }
// int main()
// {
// 	pthread_t tid[5];
// 	for (int i = 0; i < 5; i++){
// 		char* buffer = (char*)malloc(64);
// 		sprintf(buffer, "thread %d", i);
// 		pthread_create(&tid[i], NULL, Routine, buffer);
// 		printf("%s tid is %lu\n", buffer, tid[i]);
// 	}
// 	printf("I am main thread...pid: %d, ppid: %d, tid: %lu\n", getpid(), getppid(), pthread_self());
// 	for (int i = 0; i < 5; i++){
// 		void* ret = NULL;
// 		pthread_join(tid[i], &ret);
// 		printf("thread %d[%lu]...quit, exitcode: %lld\n", i, tid[i], (long long)ret); //long long不然精度损失
// 	}
// 	return 0;
// }

// #include <iostream>
// #include <pthread.h> //原生线程库
// #include <string>
// #include <unistd.h>
// #include <sys/types.h>
// #include <cstring>
// #include <vector>
// #include <stdio.h>

// // 线程1执行的例程
// void *routine(void *args)
// {
//     std::string name = static_cast<char *>(args); // 类型强转回来
//                                                   // pthread_cancel(pthread_self()); //异常终止 进程退出 ,线程不关心异常终止，父进程关系该进程退出信息
//     int cnt = 5;
//     while (true)
//     {
//         cnt--;
//         std::cout << "I am " << name << std::endl;
//         sleep(1);
//         if (!cnt)
//             break;
//     }
//     // return nullptr;
//     return (void *)123;
// }

// const int num = 5;

// int main()
// {
//     // 创建一个新线程，执行它的例程
//     // pthread_t tid;
//     // pthread_create(&tid, nullptr, routine, (void *)"thread-1");

//     // 创建一批线程
//     std::vector<pthread_t> threads;
//     for (int i = 0; i < num; i++)
//     {
//         // char buffer[64]; //不能用局部，所有线程共用一个会覆盖，应该堆开辟每个线程分配一个
//         char *buffer = new char[64];
//         snprintf(buffer, 64, "thread-%d", i + 1);
//         pthread_t tid;
//         pthread_create(&tid, nullptr, routine, (void *)buffer);
//         threads.emplace_back(tid);
//     }
//     // 等待一批线程
//     int i = 0;
//     for (auto &tid : threads)
//     {
//         i++;
//         void *ret = nullptr;     // 拿出返回值
//         pthread_join(tid, &ret); // 暂时不关心返回值
//         std::cout << "I am thread-" << i << "quit" << "return val:" << (long long)ret << std::endl;
//     }
//     return 0;
// }

// const int num = 5;

// int main()
// {
//     // 创建一个新线程，执行它的例程
//     // pthread_t tid;
//     // pthread_create(&tid, nullptr, routine, (void *)"thread-1");

//     // 创建一批线程
//     std::vector<pthread_t> threads;
//     for (int i = 0; i < num; i++)
//     {
//         // char buffer[64]; //不能用局部，所有线程共用一个会覆盖，应该堆开辟每个线程分配一个
//         char *buffer = new char[64];
//         snprintf(buffer, 64, "thread-%d", i + 1);
//         pthread_t tid;
//         pthread_create(&tid, nullptr, routine, (void *)buffer);
//         std::cout << buffer << "tid:" << std::endl;
//         threads.emplace_back(tid);
//     }
//     // 主线程继续执行后续代码
//     while (true)
//     {
//         std::cout << "I am main thread" << "pid:" << getpid() << "ppid()" << getppid() << "main tid:" << pthread_self() << std::endl;
//         sleep(2);
//     }
//     return 0;
// }